/**
 * AI API 配置
 */
const getAIConfig = () => {
  const apiKey = import.meta.env.VITE_AI_API_KEY
  const baseUrl = import.meta.env.VITE_AI_BASE_URL
  const model = import.meta.env.VITE_AI_MODEL

  if (!apiKey) {
    throw new Error('请在环境变量中配置 VITE_AI_API_KEY')
  }

  if (!baseUrl) {
    throw new Error('请在环境变量中配置 VITE_AI_BASE_URL')
  }

  if (!model) {
    throw new Error('请在环境变量中配置 VITE_AI_MODEL')
  }

  return {
    apiKey,
    baseUrl,
    model
  }
}

/**
 * 使用 AI 智能分析字段配置
 * @param {Array} columns - 字段列表
 * @param {String} tableName - 表名
 * @param {String} tableComment - 表描述
 * @param {Array} dataTables - 数据表列表
 * @returns {Promise<Array>} 增强后的字段配置
 */
export async function analyzeColumnsWithAI(columns, tableName = '', tableComment = '', dataTables = []) {
  try {
    const config = getAIConfig()
    
    // 构建提示词
    const prompt = buildPrompt(columns, tableName, tableComment, dataTables)
    
    // 调用 OpenAI 兼容的 API
    const response = await fetch(`${config.baseUrl}/chat/completions`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${config.apiKey}`
      },
      body: JSON.stringify({
        model: `${config.model}`,
        messages: [
          {
            role: 'system',
            content: `你是一个数据库字段配置专家。请根据字段名称和表信息，智能推荐合理的字段配置。
你需要分析每个字段的语义含义，并提供以下配置建议：
1. 字段描述 - 简洁明了的中文描述,最终会显示为表格的表头
2. 是否必填 - 根据业务逻辑判断
3. 是否插入字段 - 根据字段判断新增表单中是否应该包含
4. 是否编辑字段 - 根据字段判断编辑表单中是否应该包含
5. 是否列表字段 - 根据字段判断表格中是否应该显示
6. 是否查询字段 - 是否支持筛选查询
7. 查询方式 - 根据字段类型选择合适的查询方式
8. 显示类型 - 根据字段特征选择合适的表单控件（包括关联表选择）
9. 字典类型 - 如果是枚举类型，建议字典类型名称
10. 关联表配置 - 如果字段是外键，智能推荐合适的关联表

重要提示：
- 如果字段名包含"id"且不是主键，很可能是外键字段，应该使用"link"显示类型来关联其他表
- 外键字段通常命名规则为：表名_id、关联表名_id等形式
- 关联表字段应该在表单中显示为下拉选择框，在列表中显示关联表的显示字段而非ID值
- 可以根据字段名智能推断关联的数据表（如user_id关联用户表，dept_id关联部门表等）

请严格按照JSON格式返回，不要包含任何其他内容。`
          },
          {
            role: 'user',
            content: prompt
          }
        ],
        max_tokens: 6000,
        temperature: 0.3
      })
    })

    if (!response.ok) {
      throw new Error(`API 请求失败: ${response.status} ${response.statusText}`)
    }

    const data = await response.json()
    
    if (!data.choices || data.choices.length === 0) {
      throw new Error('API 返回数据格式错误')
    }

    const aiResponse = data.choices[0].message.content
    
    // 解析 AI 返回的结果
    const result = parseAIResponse(aiResponse, columns)
    
    // 生成字典 SQL
    const dictSql = generateDictSQL(result)
    
    return {
      columns: result,
      dictSQL: dictSql
    }
    
  } catch (error) {
    console.error('AI 分析字段配置失败:', error)
    throw new Error(`AI 分析失败: ${error.message}`)
  }
}

/**
 * 构建分析提示词
 */
function buildPrompt(columns, tableName, tableComment, dataTables = []) {
  const columnInfo = columns.map(col => ({
    columnName: col.columnName,
    columnType: col.columnType,
    javaType: col.javaType,
    javaField: col.javaField,
    isPk: col.isPk,
    isIncrement: col.isIncrement,
    currentComment: col.columnComment || ''
  }))

  // 构建数据表信息
  const dataTableInfo = dataTables.map(table => ({
    tableName: table.tableName,
    tableComment: table.tableComment,
    dataValueField: table.dataValueField,
    dataDisplayField: table.dataDisplayField
  }))

  return `请分析以下数据库表的字段配置：

表名: ${tableName}
表描述: ${tableComment}

字段信息:
${JSON.stringify(columnInfo, null, 2)}

可用的数据表（用于关联配置）:
${JSON.stringify(dataTableInfo, null, 2)}

请为每个字段提供智能配置建议，返回JSON格式如下：
{
  "columns": [
    {
      "columnName": "字段名",
      "columnComment": "字段描述",
      "isRequired": "0或1",
      "isInsert": "0或1", 
      "isEdit": "0或1",
      "isList": "0或1",
      "isQuery": "0或1",
      "queryType": "EQ|NE|GT|GTE|LT|LTE|LIKE|BETWEEN",
      "htmlType": "input|textarea|select|radio|checkbox|datetime|imageUpload|fileUpload|editor|link",
      "dictType": "字典类型或空字符串",
      "linkTable": "关联表名（仅当htmlType为link时需要）",
      "dictValues": [
        {"label": "选项显示名", "value": "选项值", "remark": "选项说明"}
      ],
      "reasoning": "推荐理由简要说明"
    }
  ]
}

注意事项：
1. 主键字段通常不参与插入和编辑
2. 自增字段不参与插入
3. 筛选字段不应该超过4个，否则页面展示会过于拥挤
4. 删除标记不参与列表显示、新增、编辑、查询
5. 创建时间、更新时间等系统字段通常只在列表显示，不参与新增、编辑
6. 状态、类型等枚举字段适合用下拉框或单选框
7. 备注、描述等长文本字段适合用文本域
8. 时间字段使用日期控件
9. 查询方式要根据字段类型选择：字符串用LIKE，数值用范围查询，日期用BETWEEN等
10. 如果字段是枚举类型（如状态、类型、等级等），请提供dictType和dictValues，dictValues应包含合理的选项
11. 外键字段（如xxx_id）应该使用htmlType为"link"，并指定linkTable为对应的数据表
12. 智能分析字段名称模式：
    - animal_id -> 关联pets数据表
    - user_id -> 关联用户相关表
    - dept_id -> 关联部门相关表
    - category_id -> 关联分类相关表
13. 关联表字段在列表中不应该直接显示ID值，而是显示关联表的显示字段`
}

/**
 * 解析 AI 返回的结果
 */
function parseAIResponse(aiResponse, originalColumns) {
  try {
    // 提取JSON部分
    const jsonMatch = aiResponse.match(/\{[\s\S]*\}/)
    if (!jsonMatch) {
      throw new Error('AI 返回结果格式不正确')
    }

    const aiResult = JSON.parse(jsonMatch[0])
    
    if (!aiResult.columns || !Array.isArray(aiResult.columns)) {
      throw new Error('AI 返回结果缺少 columns 字段')
    }

    // 将 AI 建议应用到原始字段配置
    const enhancedColumns = originalColumns.map(col => {
      const aiColumn = aiResult.columns.find(ai => ai.columnName === col.columnName)
      
      if (aiColumn) {
        console.log('AI字段配置:', aiColumn)
        
        // 确保字符串类型的字段使用字符串值
        const enhancedCol = {
          ...col,
          columnComment: aiColumn.columnComment || col.columnComment,
          isRequired: String(aiColumn.isRequired || '0'),
          isInsert: String(aiColumn.isInsert || '0'),
          isEdit: String(aiColumn.isEdit || '0'), 
          isList: String(aiColumn.isList || '1'),
          isQuery: String(aiColumn.isQuery || '0'),
          queryType: aiColumn.queryType || 'EQ',
          htmlType: aiColumn.htmlType || 'input',
          dictType: aiColumn.dictType || '',
          linkTable: aiColumn.linkTable || '',
          dictValues: aiColumn.dictValues || [],
          aiReasoning: aiColumn.reasoning || ''
        }
        
        console.log('增强后字段配置:', enhancedCol)
        return enhancedCol
      }
      
      return col
    })

    return enhancedColumns
    
  } catch (error) {
    console.error('解析 AI 响应失败:', error)
    throw new Error(`解析 AI 响应失败: ${error.message}`)
  }
}

/**
 * 生成字典 SQL
 */
function generateDictSQL(columns) {
  const dictSqls = []
  
  // 收集所有需要创建字典的字段
  const dictColumns = columns.filter(col => col.dictType && col.dictValues && col.dictValues.length > 0)
  
  if (dictColumns.length === 0) {
    return ''
  }
  
  dictColumns.forEach((col, index) => {
    const dictType = col.dictType
    const dictName = col.columnComment || col.columnName
    
    // 生成字典类型插入 SQL
    const dictTypeSql = `-- 插入字典类型: ${dictName}
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark) 
VALUES ('${dictName}', '${dictType}', '0', 'admin', NOW(), '${dictName}字典');
SELECT @dictTypeId${index} := LAST_INSERT_ID();`
    
    // 生成字典数据插入 SQL
    const dictDataSqls = col.dictValues.map((item, dataIndex) => {
      return `INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) 
VALUES (${dataIndex + 1}, '${item.label}', '${item.value}', '${dictType}', '', '', 'N', '0', 'admin', NOW(), '${item.remark || item.label}');`
    }).join('\n')
    
    dictSqls.push(`${dictTypeSql}\n\n${dictDataSqls}`)
  })
  
  const header = `-- AI 智能生成的字典 SQL
-- 请在数据库中执行以下 SQL 语句来创建字典配置
-- 执行前请确保 sys_dict_type 和 sys_dict_data 表存在

`
  
  return header + dictSqls.join('\n\n-- =================分隔线=================\n\n')
}

/**
 * 获取字段配置建议的文本描述
 */
export function getColumnConfigDescription(column) {
  if (!column.aiReasoning) {
    return ''
  }
  
  return `AI 建议: ${column.aiReasoning}`
}